<?php
namespace app\api\controller;

use app\api\model\RechargeOrder;
use think\Db;
use think\Request;
class NotifyController
{
    public function alipay(Request $request){
        include_once \think\facade\Env::get('EXTEND_PATH') . 'alipayqr/aop/AopClient.php';
        include_once \think\facade\Env::get('EXTEND_PATH').'alipayqr/service/AlipayTradeService.php';
        $setting = Db::name('setting')->select();

        $config = config('alipay.');
        $data = $request->param();
        $alipaySevice = new \AlipayTradeService($config);
        $result = $alipaySevice->check($data);
        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
        2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
        3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
        4、验证app_id是否为该商户本身。
        */
        $alipaySevice->writeLog(json_encode($result));
        if($result) {//验证成功
            $alipaySevice->writeLog('验证成功');

            if ($config['app_id'] !== $data['app_id']) {
                $alipaySevice->writeLog('app_id 错误');
                return "success";
            }
            $order_info = DB::name("recharge_order")->where('order_sn', $data['out_trade_no'])->find();
            if (!$order_info) {
                $alipaySevice->writeLog('订单不存在');
                return "success";
            }
            if ($order_info['pay_state'] == 1) {
                $alipaySevice->writeLog('支付宝状态==1');
                return "success";
            }
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代
            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
            //商户订单号
            $out_trade_no = $_POST['out_trade_no'];
            //支付宝交易号
            $trade_no = $_POST['trade_no'];
            //交易状态
            $trade_status = $_POST['trade_status'];
            if($_POST['trade_status'] == 'TRADE_FINISHED') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理，不执行商户的业务程序
                //注意：
                //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
            }
            else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
                $alipaySevice->writeLog('支付成功');
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理，不执行商户的业务程序
                //注意：
                //付款完成后，支付宝系统发送该交易状态通知
                    $rechargeOrder = new RechargeOrder();
                    $res = $rechargeOrder->where('order_sn', $data['out_trade_no'])->update([
                        'pay_state' => 1,
                        'completion_time' => strtotime($data['gmt_payment']),
                        'pay_trans' => $data['trade_no'],
                        'return_info' => json_encode($data),
                    ]);
                    $alipaySevice->writeLog(var_export($res,true));
                    if ($res) {
                        $member_info = Db::name('member')->where('member_id', $order_info['member_id'])->find();
                        $level =  Db::name('member_level')->where('level_id',$member_info['level_id'])->find();
                        $discount = json_decode($level['discount'],true);
                        $proportion = 0;
                        foreach ($discount as $key=>$item){
                            if ($order_info['amount']>=$item['money']){
                                $proportion =$item['proportion'];
                            }
                        }
                        $res = Db::name('member')->where('member_id', $order_info['member_id'])->update([
                            "currency" => $member_info['currency'] + (($order_info['amount']+$proportion)*$level['currency_price']),
                            'pay_count' => $member_info['pay_count'] + 1,
                            'proportion_money' => $proportion
                        ]);
                        if ($res) {
                            $rechargeOrder->where('order_sn', $data['out_trade_no'])->update([
                                'is_recharge' => 1]);
                            //返现
                            $rechargeOrder->cashBack($order_info['id'],$level['brokerage']);
                            return "success";
                        }
                    }
            }
            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            echo "success";		//请不要修改或删除

        }else {

            $alipaySevice->writeLog('sign验证错误');
            //验证失败
            echo "fail";	//请不要修改或删除
        }
    }
    public function return_url(){
        include_once \think\facade\Env::get('EXTEND_PATH').'alipayqr/service/AlipayTradeService.php';
        $config = config('alipay.');
        $arr = $_GET;
        $alipaySevice = new \AlipayTradeService($config);
        $result = $alipaySevice->check($arr);
        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
        2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
        3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
        4、验证app_id是否为该商户本身。
        */
        if($result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代
            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
            //商户订单号
            $out_trade_no = $_POST['out_trade_no'];
            //支付宝交易号
            $trade_no = $_POST['trade_no'];
            //交易状态
            $trade_status = $_POST['trade_status'];
            if($_POST['trade_status'] == 'TRADE_FINISHED') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理，不执行商户的业务程序
                //注意：
                //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
            }
            else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理，不执行商户的业务程序
                //注意：
                //付款完成后，支付宝系统发送该交易状态通知
            }
            //——请根据您的业务逻辑来编写程序
            echo "fail";	//请不要修改或删除

        }
    }
}

